package com.ls.demo.pattern.reflect;

import java.lang.reflect.Constructor;

/**
 * @program: simpleframework
 * @description:
 * @author: lishuang
 * @create: 2021-11-22 14:37
 **/

public class ConstructorCollector {
    /**
     * 通过Class对象可以获取某个类中的：构造方法；
     * <p>
     * 获取构造方法：
     * 1).批量的方法：
     * public Constructor[] getConstructors()：所有"公有的"构造方法
     * public Constructor[] getDeclaredConstructors()：获取所有的构造方法(包括私有、受保护、默认、公有)
     * 2).获取单个的方法，并调用：
     * public Constructor getConstructor(Class... parameterTypes):获取单个的"公有的"构造方法：
     * public Constructor getDeclaredConstructor(Class... parameterTypes):获取"某个构造方法"可以是私有的，或受保护、默认、公有；
     * <p>
     * 调用构造方法：
     * Constructor-->newInstance(Object... initargs)
     */
    public static void main(String[] args) throws Exception {
        Class<?> reflectTarget = Class.forName("com.ls.demo.pattern.reflect.ReflectTarget");
//        System.out.println(reflectTarget.getName());
        //1.获取所有的公有构造方法
        System.out.println("**********************所有公有构造方法*********************************");

        Constructor<?>[] constructors = reflectTarget.getConstructors();
        for (Constructor<?> constructor : constructors) {
            System.out.println(constructor);
        }
        //2.获取所有构造方法
        System.out.println("************所有的构造方法(包括：私有、受保护、默认、公有)***************");
        Constructor<?>[] declaredConstructors = reflectTarget.getDeclaredConstructors();
        for (Constructor<?> declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor);
        }
        //3.获取单个带参数的公有方法
        System.out.println("*****************获取公有、有两个参数的构造方法*******************************");
        Constructor<?> constructor = reflectTarget.getConstructor(String.class, int.class);
        System.out.println("con=====" + constructor);
        //4.获取单个私有的构造方法
        System.out.println("******************获取私有构造方法*******************************");
        constructor = reflectTarget.getDeclaredConstructor(int.class);

        System.out.println("private con = " + constructor);
        System.out.println("******************调用私有构造方法创建实例*******************************");
        //暴力反射（忽略掉访问修饰符）
        constructor.setAccessible(true);
        ReflectTarget newInstance = (ReflectTarget) constructor.newInstance(1);

    }
}
